package com.bao.examples.security;

import java.io.*;
import java.security.*;
import java.security.spec.*;

//http://docs.oracle.com/javase/tutorial/security/apisign/examples/VerSig.java
//%java VerSig suepk sig data
class VerSig
{

	public static void main(String[] args)
	{

		/* Verify a DSA signature */

		if(args.length != 3)
		{
			System.out.println("Usage: VerSig publickeyfile signaturefile datafile");
		}
		else
			try
			{

				/* import encoded public key */

				FileInputStream keyfis = new FileInputStream(args[0]);
				byte[] encKey = new byte[keyfis.available()];
				keyfis.read(encKey);

				keyfis.close();

				X509EncodedKeySpec pubKeySpec = new X509EncodedKeySpec(encKey);

				KeyFactory keyFactory = KeyFactory.getInstance("DSA", "SUN");
				PublicKey pubKey = keyFactory.generatePublic(pubKeySpec);

				/* input the signature bytes */
				FileInputStream sigfis = new FileInputStream(args[1]);
				byte[] sigToVerify = new byte[sigfis.available()];
				sigfis.read(sigToVerify);

				sigfis.close();

				/*
				 * create a Signature object and initialize it with the public
				 * key
				 */
				Signature sig = Signature.getInstance("SHA1withDSA", "SUN");
				sig.initVerify(pubKey);

				/* Update and verify the data */

				FileInputStream datafis = new FileInputStream(args[2]);
				BufferedInputStream bufin = new BufferedInputStream(datafis);

				byte[] buffer = new byte[1024];
				int len;
				while(bufin.available() != 0)
				{
					len = bufin.read(buffer);
					sig.update(buffer, 0, len);
				}
				;

				bufin.close();

				boolean verifies = sig.verify(sigToVerify);

				System.out.println("signature verifies: " + verifies);

			}
			catch(Exception e)
			{
				System.err.println("Caught exception " + e.toString());
			}
		;

	}

}
